perm filename DECDMP.MAC[SS,SYS] blob sn#259796 filedate 1977-01-19 generic text, type C, neo UTF8
COMMENT āŠ—   VALID 00004 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00002 00002		TITLE	DECDMP
C00005 00003		LOC	ABSLOC		ABSOLUTE ASSEMBLY
C00007 00004	STRT:	MOVEI	R1,CGET		RESTART ADDRESS.
C00016 ENDMK
CāŠ—;
	TITLE	DECDMP
	SUBTTL	FROM THE ANCIENT DECUSAUR

KL10==0
NORIM==1
KASIM==1
IFNDEF KL10,<KL10==1>			;KL10 VERSION BY DEFAULT
	
APR==0
PI==4
CTY==120
DTC==210				;MICRO TAPE CONTROL REGISTER
DTS==214				;MICRO TAPE STATUS  REGISTER
IFE KL10,<DC==200>
IFN KASIM,<DC==204>

IFN KL10,<	DC==204
		DTE==200
		CCA==14
		KLPAG==10
		SWEEPB==200000		;SWEEP BUSY IN KL10 APR CONI.
		DONG11==20000		;RING 11'S DOORBELL
		DTFLG==444		;DTE20 OPERATION COMPLETE FLAG IN EPT
		DTF11==450		;      10 FROM 11 ARGUMENT
		DTCMD==451		;      TO 11 COMMAND WORD
>;IFN KL10

	
R0=0
R1=1
R2=2
R3=3
R4=4
R5=5
R6=6
R7=7
R10=10
R11=11

ABSLOC==77600				;32K DECDMP
LBLOCK==340
;ABSLOC==177600				;64K DECDMP
;LBLOCK==700
;LBLOCK==1002				;TRADITIONAL 63 7/8 K DECDMP
;ABSLOC==377600				;128K DECDUMP
;IFN KL10,<ABSLOC==377000>		;KL10 NEEDS A PAGE FOR THE EPT
IFN KL10,<ABSLOC==177000>		;KL10 NEEDS A PAGE FOR THE EPT
;LBLOCK==1077				;MAXIMUM LAST BLOCK TO WRITE 71.5K

FIRST==10				;FIRST LOCATION TO DUMP-1
FBLOCK==4				;FIRST BLOCK TO WRITE ON TAPE.
LDISPL==LBLOCK-FBLOCK
;MAXIMUM IS BLOCKS 4-1077 FOR USE = 1074 BLOCKS = 71.5K OF DATA

LAST=<<LDISPL+1>*200>			;LAST ADDRESS TO DUMP+1

IFG LAST-ABSLOC<
PRINTX "LOSER, YOU ARE GOING TO CLOBBER DECDUMP WITH DATA"
>
	LOC	ABSLOC		;ABSOLUTE ASSEMBLY
IFE KL10,<
IFE NORIM,<
	RIM10B			;MAKE BINARY TAPE IN READIN MODE
>;IFE NORIM
>;IFE KL10
IFN KL10,<
	BLOCK	500		;ROOM FOR DTE COMM. AREA, ETC.
DTEXX:	0			;JSR HERE
	MOVEM	R3,DTCMD+ABSLOC
	SETZM	DTFLG+ABSLOC		;CLEAR 11'S RESPONSE FLAG
	CONO	DTE,DONG11		;RING FOR 11
	SKIPN	DTFLG+ABSLOC		;WAIT FOR RESPONSE
	JRST	.-1
	MOVE	R3,DTF11+ABSLOC		;GET 11'S RESPONSE WORD
	JRST	@DTEXX

SAVT:	0

KLTYI:	MOVEI	R3,3400
	JSR	DTEXX
	JUMPE	R3,KLTYI
	CAIL	R3,"A"+40
	CAILE	R3,"Z"+40
	CAIA
	SUBI	R3,40
KLTYO:	MOVEM	R3,SAVT
	ANDI	R3,177
	JSR	DTEXX
	MOVE	R3,SAVT
	JRST	(R6)

IFG .-ABSLOC-600,<PRINTX LOSER.  TOO MUCH KL10 CRUD.>
	LOC	ABSLOC+600	
>;KL10.  SAME OLD STARTING ADDRESS
STRT:	MOVEI	R1,CGET		;RESTART ADDRESS.
STRT1:	CONO	APR,200000	;APR IO RESET
	CONO	PI,10400	;CLEAR&DEACTIVATE PI

IFN KL10,<
	CONO KLPAG,ABSLOC/1000
>;IFN KL10

IFE KL10,<	CONO	CTY,3600	;CLEAR I/O BUSY&DONE  >;IFE KL10


				;HERE TO SCAN A FRESH COMMAND
CGET:	CONO	DTC,0		;CLEAR DECTAPE CONTROL
	MOVEI	R3,15		;PICKUP CR
	JSP	R6,TYO		;TYPE IT
	MOVEI	R3,12		;PICKUP LF
	JSP	R6,TYO		;TYPE IT.
	MOVEI	R4,CDISP	;@ADDRESS OF COMMAND SCANNER
	MOVEI	R10,FBLOCK	;LOAD 10 NUMBER OF FIRST BLOCK TO WRITE
	JSP	R0,@(R4)	;READ COMMAND
	ANDI	R2,7		;OCTAL NUMBER IN 2
	LSH	R2,3		;SHIFT IT TO MAKE UNIT NUMBER FIELD
	MOVE	R7,R2		;LOAD UNIT NUMBER FIELD
	JSP	R0,@(R4)	;PROCESS nD or nL COMMAND,
				;CONTINUE CTY SCAN IF "," SEEN
	JSP	R0,@(R4)	;DISPATCH FOR n,D or n,L
				;CONTINUE SCAN IF COMMA COMMA
				;IF ,,nG THEN n WILL BE IN R2
				;AND R4 WILL HAVE -1,,R11
	HRRZM	R2,R11		;SAVE CONTENTS OF R2 IN R11
CGETX:	JSP	R0,@(4)		;DISPATCH @11 FOR G, OR HANG FIRE.
	JRST	CGETX		;HANG UNTIL D,L,G TYPED.


CMND:	SETZI	R2,0		;CLEAR R2
CMND1:

IFE KL10,<
	CONSO	CTY,40		;SKIP IF INPUT DONE
	JRST	.-1		;NO INPUT. WAIT. 
	DATAI	CTY,R3		;READ CTY
	JSP	R6,TYO		;ECHO IT
>;IFE KL10

IFN KL10,<	JSP	R6,KLTYI	>;IFN KL10  READ AND ECHO

	ANDI	R3,177		;AND OUT ANY EXTRA BITS
	CAIN	R3,"L"		;LOAD FROM TAPE COMMAND?
	HRROI	R4,LOADGO	;SET UP DISPATCH ADDRESS
	CAIN	R3,"D"		;DUMP ON TAPE?
	HRROI	R4,DUMPGO	;SET DISPATCH
	CAIN	R3,"G"		;START COMMAND?
	HRROI	R4,R11		;SET DISPATCH
	JUMPL	R4,@R0		;IF DISPATCH SET, RETURN.
	CAIN	R3,","		;COMMA?
	JRST	@R0		;YES. RETURN
	ROT	R3,-3		;SHIFT CHARACTER RIGHT 3
	LSHC	R2,3		;DIGIT SHIFTS INTO 2.
	CAIE	R3,"0"		;IS THE DATA A NUMBER?
	JRST	CGET		;NO. FLUSH THIS COMMAND
	JRST	CMND1		;YES. ACCUMULATE (OCTAL)


XX650:	DATAI	DC,R2		;READ BLOCK NUMBER INTO 2
	CAMN	R2,R3		;ARE WE AT THE RIGHT PLACE?
	JRST	@R0		;YES. RETURN. WE ARE BLOCK 4 OR 1002
	CAML	R2,R10		;ARE WE IN FRONT OF FIRST BLOCK?
	CAIL	R2,LDISPL(R10)	;NO. BEHIND LAST BLOCK?
	JRST	XX703		;WE ARE GOING IN THE RIGHT DIRECTION.
				;FALL THRU IF WE ARE IN THE MIDDLE OF TAPE.

;HERE TO LOCATE EITHER END OF THE TAPE.
;R7 IS SET UP WITH UNIT NUMBER AND POSSIBLY DIRECTION.

ENDGET:	CONO	DTC,223200(R7)	;SELECT, TURN ON UNIT. DELAY, READ BLOCK NUMS
	CONO	DC,4010		;SET UP DC FOR READING
XX660:	CONSZ	DTS,6		;ERROR BITS?
	JRST	XX672		;YES. END OF TAPE OR ILL OP
	CONSO	DC,1000		;DATA READY?
	JRST	XX660		;NO DATA YET. WAIT FOR IT.
	DATAI	DC,R2		;READ A BLOCK NUMBER
	TRZ	R7,10000	;ASSUME WE WILL GO FORWARD TO END
	CAIGE	R2,<LDISPL/2>(R10)	;ARE WE CLOSE TO REAR END?
	TRO	R7,10000	;NO. WELL GO REVERSE TO FRONT OF TAPE
	CAIG	R2,LDISPL(R10)	;ARE WE PAST REAR END OF TAPE?
	CAMGE	R2,R10		;OR IN FRONT OF BEGINNING?
XX672:	SKIPA	R3,R10		;YES. WE ARE IN SOME "END ZONE"
	JRST	ENDGET		;NOT AT EITHER END YET.
	TRCN	R7,10000	;HERE WE ARE AT THE END. CHANGE DIRECTION
	MOVEI	R3,LDISPL(R10)	;IF WE WERE IN REVERSE, WE READ 1002
				;OTHERWISE READ BLOCK 4.  R3 SET WITH BLOCK
	CONI	DTC,R2		;READ DTC CONDITIONS
	XOR	R2,R7		;XOR WITH OUR DIRECTION 
	TRNE	R2,10000	;ARE WE GOING TO SWITCH DIRECTIONS?
	CONO	DTC,222200(R7)	;YES. SET FOR CHANGE AND DELAY.
	TRNN	R2,10000	;ARE WE GOING IN SAME DIRECTION?
XX703:	CONO	DTC,220200(R7)	;SET CONDITIONS, NO DELAY NEEDED
	MOVEI	R6,XX650	;SET RETURN ADDRESS
				;FALL INTO ROUTINE TO WAIT FOR EVERYTHING


WAIT:	CONSZ	DC,1000		;DATA READY YET?
	JRST	@R6		;YES. RETURN
	CONSO	DTS,2000	;SKIP IF DELAY IN PROGRESS
	CONSO	DTS,207		;SKIP IF ERROR, DONE OR NULL
	JRST	WAIT		;NONE OF THESE. KEEP WAITING
	CONSZ	DC,1000		;WE BETTER HAVE DATA NOW.
	JRST	@R6		;OK. RETURN
	MOVEI	R3,7		;OOPS. LOAD A BELL
	MOVEI	R6,STRT1	;LOAD RESTART ADDRESS AND DO TYO


IFE KL10,<
TYO:	DATAO	CTY,R3		;WRITE ON CTY
TYO1:	CONSZ	CTY,20		;WAIT FOR CTY TO BE FREE
	JRST	TYO1		;LOOP WAITING
	JRST	0(R6)		;RETURN. CALLED BY JSP 6,
>;IFE KL10

IFN KL10,<
TYO:	JRST	KLTYO	
>;IFN KL10

;HERE WITH JSP 5,
XFREAD:	JSP	R0,ENDGET	;LOCATE THE END OF THE TAPE.
	CONO	DTC,220300(R7)	;SET TAPE TO READ DATA
XFGO:	TRNE	R7,10000	;SKIP IF WE ARE GOING FORWARD
	JRST	BAKSET		;GOING BACKWARDS
	MOVEI	R2,FIRST	;FIRST DATA ADDRESS-1
	MOVEI	R3,1		;DATA ADDRESS INCREMENT
	MOVEI	R4,LAST		;LAST DATA ADDRESS+1
XX731:	ADDM	R3,R2		;INCREMENT DATA ADDRESS
	CAME	R2,R4		;DONE YET?
	JRST	XX743		;NOT DONE YET
	CONSO	DC,400		;SKIP IF OUTPUT
	CONO	DC,0		;INPUT IS DONE. STOP DC.
	CONSO	DTS,1		;TAPE JOB DONE YET?
	JRST	.-1		;NO. WAIT.
	JRST	2(R5)		;DOUBLE SKIP RETURN



XX741:	MOVEI	R2,LAST-1	;IN REVERSE. FIRST WORD'S ADDRESS
	MOVNI	R3,1		;ADDRESS INCREMENT IS -1
XX743:	JSP	R6,WAIT		;WAIT FOR DATA TO BE AVAILABLE
	XCT	0(R5)		;XCT A DATA MOVING INSTRUCTION
	XCT	1(R5)		;XCT NEXT INSTRU AFTER CALL
	JUMPG	R2,XX731	;IF ADDRESS>0 LOOP
	JUMPL	R2,XX741	;GO SET UP FOR TRANSFER IN REVERSE
DUMP:	JSP	R0,ENDGET	;LOOK FOR END OF TAPE
	CONO	DTC,220700(R7)	;SET UP TO WRITE DATA
	CONO	DC,3410		;SET UP DC FOR WRITING DATA
	JSP	R5,XFGO		;ENTER TRANSFER ROUTINE
	DATAO	DC,0(R2)
CDISP:	JFCL	CMND		;JSP @ HERE.
	JSP	R5,XFREAD	;CALL TRANSFER ROUTINE TO READ AND CHECK
	DATAI	DC,R0
	CAMN	R0,(R2)
	JSP	R0,XX772
DUMPGO:	JRST	DUMP
BAKSET:	MOVSI	R2,377770	;SET R2 TO IGNORE 10 WORDS!
	MOVSI	R3,1		;SET INCREMENT
	MOVEI	R4,FIRST	;SET REAL STOPPING ADDRESS
	JRST	XX743		;GO OFF AND WAIT FOR TRANSFERS


LOAD:	JSP	R5,XFREAD	;CALL TRANSFER-READ ROUTINE
	DATAI	DC,(R2)		;INSTRUCTION XCTED TO STORE DATA
LOADGO:	MOVEI	R0,LOAD		;MAKE SURE R0 GET ADDRESS IN CASE OF ERROR
XX772:	CONSZ	DTS,10		;HERE WHEN LOAD IS FINISHED.
	JRST	@R0		;HERE IF THERE'S A PARITY ERROR. DO IT AGAIN
	CONO	DTC,0		;SHUT OFF THE DECTAPE
	JRST	2,@R1		;ZERO FLAGS. JUMP TO CGET

	END	STRT